﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Project2.多线程
{
    internal class TaskStudy
    {
        private static void MainTaskStudy(string[] args)
        {//创建方法
            Task task = new Task(() =>
            {
                Console.WriteLine($"Task 开启线程 ID={Thread.CurrentThread.ManagedThreadId}处理业务");
                Thread.Sleep(2000);
            });
            //开启任务
            task.Start();
            task.Wait();

            Task task1 = Task.Run(() =>
            {
                Console.WriteLine($"Task1 开启线程{Thread.CurrentThread.ManagedThreadId}处理业务");
                Thread.Sleep(2000);
            });
            //执行结果如下所示，不论执行多少次，“Task1 后续执行”永远在“Task1 开启线程”之后，即等待“Task1 开启线程”完成之后，才会处理“Task1 后续执行”，并不会阻塞其他线程。
            task1.ContinueWith(t =>
            {
                Console.WriteLine($"Task1 后续执行{Thread.CurrentThread.ManagedThreadId}处理业务");
                Thread.Sleep(500);
            });

            Task<string> task3 = new Task<string>(DoTask3);
            task3.Start();
            task3.Wait();
            Console.WriteLine("end");

            Task<string> task4 = new Task<string>(() =>
            {
                Console.WriteLine("task4");
                return "task4";
            });
            task4.Start();
            task4.Wait();

            List<Task> list1 = new List<Task> { task1, task3, task4 };
            Task.WaitAll(list1.ToArray());//Task.WaitAll等到所有任务都完成之后，才进行主线程的下一步操作，即阻塞主线程；

            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}完成");
        }

        private static string DoTask3()
        {
            Console.WriteLine("task3");
            return "task3";
        }
    }
}